//package com.jsu.web.gateway.filter;
//
//
//import org.example.utils.common.JwtUtil;
//import org.example.utils.common.WebJwtUtil;
//import io.jsonwebtoken.Claims;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.lang.StringUtils;
//import org.springframework.cloud.gateway.filter.GatewayFilterChain;
//import org.springframework.cloud.gateway.filter.GlobalFilter;
//import org.springframework.core.Ordered;
//import org.springframework.http.HttpHeaders;
//import org.springframework.http.HttpStatus;
//import org.springframework.http.server.reactive.ServerHttpRequest;
//import org.springframework.http.server.reactive.ServerHttpResponse;
//import org.springframework.stereotype.Component;
//import org.springframework.web.server.ServerWebExchange;
//import reactor.core.publisher.Mono;
//
//import java.net.URI;
//
//
//@Component("Authorize")
//@Slf4j
//public class AuthorizeGatewayFilterFactory implements Ordered, GlobalFilter {
//
//    @Override
//    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//
////        URI uri = exchange.getRequest().getURI();
//        //1.获取request和response对象
//        ServerHttpRequest request = exchange.getRequest();
//        ServerHttpResponse response = exchange.getResponse();
//        log.info(request.getURI().getPath());
//        //2.判断是否是登录
//        if(request.getURI().getPath().contains("/login")
//        ){
//            log.info("属于登录注册");
//            //放行
//            return chain.filter(exchange);
//        }
//
//
//        String state = "0";
//        //3.获取token
//        String shortToken = request.getHeaders().getFirst("token");// 从 http 请求头中取出 token
//        String longToken = request.getHeaders().getFirst("token-long");
//        log.info("短期token:{}", shortToken);
//        log.info("长期token:{}", longToken);
//        //4.判断token是否存在
//        if(StringUtils.isBlank(shortToken) && StringUtils.isBlank(longToken)){
//            response.setStatusCode(HttpStatus.UNAUTHORIZED);
//            return response.setComplete();
//        }
//
//        //5.判断token是否有效
//        ServerWebExchange modifiedExchange = null;
//        try {
//            //先验证短期token
//            Claims claimsBody = WebJwtUtil.getClaimsBody(shortToken);
//            Claims claimsBodyLong = null;
//            //是否是过期
//            int result = WebJwtUtil.verifyToken(claimsBody);
//            Long phone = null;
//            if(result == 1 || result  == 2){
//                //短期token过期
//                log.info("检查长期令牌");
//                //验证长期token
//                claimsBodyLong = WebJwtUtil.getClaimsBody(longToken);
//                int count = WebJwtUtil.verifyToken(claimsBodyLong);
//                if(count == 1 || count == 2) {
//                    //长期token过期
//                    log.info("长期token过期");
//                    response.setStatusCode(HttpStatus.UNAUTHORIZED);
//                    return response.setComplete();
//                }
//                phone = claimsBodyLong.get("id", Long.class);
//                log.info("phone:{}",phone);
//                //是否是过期
//                if (null == phone) {
//                    throw new RuntimeException("用户不存在，请重新登录");
//                }
//                log.info("通过长期token登录成功，需要刷新token");
//                state = "1";
//            }
//            else {
//                log.info("短期token验证通过");
//                // 获取用户手机号
////                phone = claimsBody.get("id", Long.class);
////                log.info("phone:{}",phone);
////                if(phone== null){
////                    throw new RuntimeException("用户不存在，请重新登录");
////                }
//            }
//            if (claimsBody != null|| claimsBodyLong != null) {
//                // 将用户信息存储到请求的上下文中
//                // 创建一个新的 HttpHeaders 对象
//                HttpHeaders headers = new HttpHeaders();
//                headers.putAll(request.getHeaders());
//                headers.add("phone", phone.toString());
//                headers.add("state", state);
//
//                // 使用 mutate() 方法来修改 HTTP 头信息，并创建新的 ServerHttpRequest 对象
//                ServerHttpRequest modifiedRequest = request.mutate()
//                        .headers(httpHeaders -> httpHeaders.addAll(headers))
//                        .build();
//
//                // 使用修改后的 ServerHttpRequest 对象创建新的 ServerWebExchange 对象
//                 modifiedExchange = exchange.mutate()
//                        .request(modifiedRequest)
//                        .build();
//
//
//            }
//        }catch (Exception e){
//            e.printStackTrace();
//            response.setStatusCode(HttpStatus.UNAUTHORIZED);
//            return response.setComplete();
//        }
////        6.放行
//        log.info("state:{}",state);
//        return chain.filter(modifiedExchange);
////        return chain.filter(exchange);
//    }
//
//
//    /**
//     * 优先级设置  值越小  优先级越高
//     * @return
//     */
//    @Override
//    public int getOrder() {
//        return 0;
//    }
//}